package main

import (
	"fmt"
	"time"
)

func main() {
	// ==========================================
	// if/else 条件语句
	// ==========================================

	// 基本if语句
	age := 18
	if age >= 18 {
		fmt.Println("你已经成年了")
	}

	// if-else语句
	score := 85
	if score >= 90 {
		fmt.Println("优秀")
	} else if score >= 80 {
		fmt.Println("良好")
	} else if score >= 60 {
		fmt.Println("及格")
	} else {
		fmt.Println("不及格")
	}

	// if语句的特殊写法：可以在条件判断之前执行一个简单的语句
	if num := 15; num%2 == 0 {
		fmt.Printf("%d 是偶数\n", num)
	} else {
		fmt.Printf("%d 是奇数\n", num)
	}
	// 注意：num的作用域仅在if-else块内

	// 错误处理的常见模式
	if value, err := someFunction(); err != nil {
		fmt.Println("发生错误:", err)
	} else {
		fmt.Println("获取的值:", value)
	}

	// ==========================================
	// switch 语句
	// ==========================================

	// 基本switch语句
	day := "星期三"
	switch day {
	case "星期一":
		fmt.Println("Monday")
	case "星期二":
		fmt.Println("Tuesday")
	case "星期三":
		fmt.Println("Wednesday")
	case "星期四":
		fmt.Println("Thursday")
	case "星期五":
		fmt.Println("Friday")
	default:
		fmt.Println("Weekend")
	}

	// switch的特殊写法：可以在switch语句前执行一个简单的语句
	switch today := time.Now().Weekday(); today {
	case time.Saturday, time.Sunday: // 多条件匹配
		fmt.Println("今天是周末")
	default:
		fmt.Println("今天是工作日")
	}

	// 没有表达式的switch（类似于if-else链）
	score = 85
	switch {
	case score >= 90:
		fmt.Println("A级")
	case score >= 80:
		fmt.Println("B级")
	case score >= 70:
		fmt.Println("C级")
	case score >= 60:
		fmt.Println("D级")
	default:
		fmt.Println("F级")
	}

	// 使用fallthrough关键字（继续执行下一个case）
	num := 75
	switch {
	case num < 100:
		fmt.Println("数字小于100")
		fallthrough
	case num < 200:
		fmt.Println("数字小于200")
		fallthrough
	default:
		fmt.Println("这条信息总是会打印")
	}

	// ==========================================
	// for 循环
	// ==========================================

	// 基本for循环
	for i := 0; i < 5; i++ {
		fmt.Printf("%d ", i)
	}
	fmt.Println()

	// while风格的for循环
	count := 0
	for count < 5 {
		fmt.Printf("%d ", count)
		count++
	}
	fmt.Println()

	// 无限循环
	count = 0
	for {
		fmt.Printf("%d ", count)
		count++
		if count >= 5 {
			break // 使用break退出循环
		}
	}
	fmt.Println()

	// for-range循环遍历切片
	numbers := []int{1, 2, 3, 4, 5}
	for index, value := range numbers {
		fmt.Printf("索引:%d 值:%d\n", index, value)
	}

	// for-range循环遍历字符串（按Unicode字符遍历）
	for index, char := range "Hello, 世界" {
		fmt.Printf("位置:%d 字符:%c Unicode:%d\n", index, char, char)
	}

	// for-range循环遍历map
	scores := map[string]int{
		"Alice": 98,
		"Bob":   87,
		"Carol": 92,
	}
	for name, score := range scores {
		fmt.Printf("%s的分数是%d\n", name, score)
	}

	// ==========================================
	// break和continue
	// ==========================================

	// break的使用
	fmt.Println("\nbreak示例:")
	for i := 0; i < 10; i++ {
		if i == 5 {
			break // 当i等于5时退出循环
		}
		fmt.Printf("%d ", i)
	}
	fmt.Println()

	// continue的使用
	fmt.Println("\ncontinue示例:")
	for i := 0; i < 10; i++ {
		if i%2 == 0 {
			continue // 跳过偶数
		}
		fmt.Printf("%d ", i)
	}
	fmt.Println()

	// 带标签的break
	fmt.Println("\n带标签的break示例:")
OuterLoop:
	for i := 0; i < 3; i++ {
		for j := 0; j < 3; j++ {
			if i == 1 && j == 1 {
				break OuterLoop // 跳出外层循环
			}
			fmt.Printf("i=%d j=%d\n", i, j)
		}
	}

	// 带标签的continue
	fmt.Println("\n带标签的continue示例:")
OuterLoop2:
	for i := 0; i < 3; i++ {
		for j := 0; j < 3; j++ {
			if j == 1 {
				continue OuterLoop2 // 继续外层循环的下一次迭代
			}
			fmt.Printf("i=%d j=%d\n", i, j)
		}
	}

	// ==========================================
	// 练习
	// ==========================================

	// 1. 编写一个程序，使用if-else语句判断一个年份是否是闰年
	// 提示：闰年规则：能被4整除但不能被100整除，或者能被400整除

	// 2. 使用switch语句编写一个简单的计算器程序
	// 接受两个数字和一个运算符（+、-、*、/），执行相应的运算

	// 3. 使用for循环打印出九九乘法表

	// 4. 编写一个程序，使用continue跳过100以内的所有偶数，只打印奇数

	// 5. 使用带标签的break实现一个简单的查找程序
	// 在一个二维数组中查找指定的数字，找到后立即退出所有循环
}

// 用于演示错误处理的辅助函数
func someFunction() (int, error) {
	// 这里简单返回一个值和nil错误
	return 42, nil
}
